class Person {
  String name;

  int age;

  int height;

  /**
   * 属性前加late表示允许稍后初始化，但第一次调用之前必须要完成初始化，否则会报错
   */
  late int wigth;

  /**
   * 属性前加下划线表示为私有变量
   */
  String _idCard;

  /**
   * 简写的构造函数
   */
  Person.all(this.name, this.age, this.height, this.wigth, this._idCard);

  /**
   * 定义默认值的构造函数（初始化列表）
   * 构造函数的执行顺序：初始化列表->父类的构造函数->当前类的构造函数
   */
  Person.defaultPerson()
      : name = "wy",
        age = 100,
        height = 200,
        wigth = 300,
        _idCard = "123" {}

  printPerson() {
    _printPerson();
  }

  /**
   * 方法前加下划线表示为私有方法
   */
  _printPerson() {
    print("name: ${this.name}. age: ${this.age}. id: ${this._idCard}");
  }

  /**
   * get修饰符，调用时可以直接像获取属性一样拿到返回值
   */
  get area {
    return this.wigth * this.height;
  }

  /**
   * set修饰符，调用时可以直接像修改属性一样赋值
   */
  set heightValue(value) {
    this.height = value;
  }
}
